from flask import Flask, make_response, jsonify, g, current_app as app,Blueprint
from sqlalchemy import select,insert,update,func,join
from sqlalchemy.sql import text
from eim.tools.dbtool import DBTool
from eim import db
from eim.tools.searchtool import SearchCondition,SearchConditionList,MatchLogic,PartnerRS
from eim.result.simple_result import SimpleResult

sysbp=Blueprint("sysbp","sysbp",__name__,url_prefix="/sys")

@sysbp.route("/getNewCode/<tname>/<prechar>/<datePart>/<int:bitlen>")
def makeNewCode(tname,prechar,datePart,bitlen):
    """
    生成新的编码编码结构[字符前缀]+[8位日期]+指定长度的顺序码
    如:u202405010000001,202405010000001,u000001,000001等
    Args:
        tname (_type_): 使用编码的数据表，如果参数值取值为*表示全局编码
        prechar (_type_): 字符前缀，如果参数取值为*表示不使用字符前缀
        datePart (_type_): 日期部分，如果参数取值为*表示不使用日期部分
        bitlen (_type_): 顺序号长度,参数取值必须是大于0的整数
    """
    try:
        if (datePart=="*"):
            datePart=''
        if(prechar=="*"):
            prechar=''
        if(tname=="*"):
            tname=''
        dtool = DBTool(db)
        result = dtool.getNewCode(tname,prechar,datePart,bitlen)
        return SimpleResult(status='T',value=result).toDict()
    except Exception as es:
        errinfo = str(es)
        app.logger.error(errinfo)
        return SimpleResult(msg=errinfo).toDict()

@sysbp.route("/recode/<tname>/<datepart>/<rcode>")
def returnCodeToPool(tname,datepart,rcode):
    """
    退回不使用的编码到编码池中

    Args:
        tname (_type_): 编码所属的数据表名称,当参数取值为*时表示全局编码
        datepart (_type_): 编码的日期部分，当参数取值为*时表示不存在日期部分
        rcode (_type_): 待退回的编码
    """
    if(tname=="*"):
        tname=''
    if(datepart=="*"):
        datepart=''
    try:
        dtool = DBTool(db)
        result = dtool.returnCode(tname,datepart,rcode)
        if(result>0):
            return SimpleResult(status="T",value="退回成功").toDict()
        else:
            return SimpleResult(status="T",value="退回失败").toDict()
    except Exception as es:
        errorinfo = str(es)
        app.logger.error(errorinfo)
        return SimpleResult(msg=errorinfo).toDict()
    

@sysbp.route("/testSearchList",methods=["GET"])
def testSearchList():
    """
    测试检索条件类
    """
    sc = SearchCondition("username",MatchLogic.EQ,"jasonzhang")
    sl = SearchConditionList()
    sl.appendCondition(PartnerRS.AND,sc)
    
    sc1 = SearchCondition("age",MatchLogic.GE,"12")
    sl.appendCondition(PartnerRS.AND,sc1)
    
    ls = sl.getList()
    return SimpleResult(status="T",value=ls).toDict()
    